"""
日志管理模块
统一的日志配置和管理，支持中文日志，敏感信息脱敏
"""
import sys
import re
from pathlib import Path
from loguru import logger
from datetime import datetime


class LoggerManager:
    """日志管理器"""
    
    def __init__(self, log_dir="logs", level="INFO"):
        """
        初始化日志管理器
        
        参数:
            log_dir: 日志目录
            level: 日志级别
        """
        self.log_dir = Path(log_dir)
        self.log_dir.mkdir(exist_ok=True)
        self.level = level
        self._setup_logger()
    
    def _setup_logger(self):
        """配置日志器"""
        # 移除默认处理器
        logger.remove()
        
        # 控制台输出（彩色）
        logger.add(
            sys.stdout,
            format="<green>{time:YYYY-MM-DD HH:mm:ss}</green> | <level>{level: <8}</level> | <cyan>{name}</cyan>:<cyan>{function}</cyan> - <level>{message}</level>",
            level=self.level,
            colorize=True
        )
        
        # 文件输出（按日期分割）
        log_file = self.log_dir / "trading_{time:YYYYMMDD}.log"
        logger.add(
            log_file,
            format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
            level=self.level,
            rotation="00:00",  # 每天午夜轮转
            retention="30 days",  # 保留30天
            compression="zip",  # 压缩旧日志
            encoding="utf-8",
            enqueue=True  # 异步写入
        )
        
        # 错误日志单独记录
        error_log_file = self.log_dir / "error_{time:YYYYMMDD}.log"
        logger.add(
            error_log_file,
            format="{time:YYYY-MM-DD HH:mm:ss} | {level: <8} | {name}:{function}:{line} - {message}",
            level="ERROR",
            rotation="00:00",
            retention="90 days",  # 错误日志保留90天
            compression="zip",
            encoding="utf-8",
            enqueue=True
        )
    
    @staticmethod
    def mask_sensitive_info(message: str) -> str:
        """
        脱敏敏感信息
        
        参数:
            message: 原始消息
            
        返回:
            脱敏后的消息
        """
        # API密钥脱敏
        message = re.sub(
            r'(api[_-]?key["\']?\s*[:=]\s*["\']?)([a-zA-Z0-9]{8})[a-zA-Z0-9]+([a-zA-Z0-9]{4})',
            r'\1\2****\3',
            message,
            flags=re.IGNORECASE
        )
        
        # Secret脱敏
        message = re.sub(
            r'(secret["\']?\s*[:=]\s*["\']?)([a-zA-Z0-9]{8})[a-zA-Z0-9]+([a-zA-Z0-9]{4})',
            r'\1\2****\3',
            message,
            flags=re.IGNORECASE
        )
        
        # 密码脱敏
        message = re.sub(
            r'(password["\']?\s*[:=]\s*["\']?)([^\s"\']{2})[^\s"\']+([^\s"\']{2})',
            r'\1\2****\3',
            message,
            flags=re.IGNORECASE
        )
        
        # 余额脱敏（保留前后各2位）
        message = re.sub(
            r'(余额|balance)["\']?\s*[:=]\s*["\']?(\d{2})\d+(\d{2})',
            r'\1: \2****\3',
            message,
            flags=re.IGNORECASE
        )
        
        return message
    
    @staticmethod
    def log_trade(action: str, symbol: str, side: str, amount: float, price: float, **kwargs):
        """
        记录交易日志
        
        参数:
            action: 操作类型（开仓/平仓/止损等）
            symbol: 交易对
            side: 方向（买/卖）
            amount: 数量
            price: 价格
            **kwargs: 其他信息
        """
        extra_info = " | ".join([f"{k}={v}" for k, v in kwargs.items()])
        message = f"交易操作 | {action} | {symbol} | {side} | 数量={amount} | 价格={price}"
        if extra_info:
            message += f" | {extra_info}"
        logger.info(message)
    
    @staticmethod
    def log_strategy(strategy_name: str, action: str, **kwargs):
        """
        记录策略日志
        
        参数:
            strategy_name: 策略名称
            action: 操作
            **kwargs: 其他信息
        """
        extra_info = " | ".join([f"{k}={v}" for k, v in kwargs.items()])
        message = f"策略执行 | {strategy_name} | {action}"
        if extra_info:
            message += f" | {extra_info}"
        logger.info(message)
    
    @staticmethod
    def log_risk(risk_type: str, message: str, **kwargs):
        """
        记录风险日志
        
        参数:
            risk_type: 风险类型
            message: 消息
            **kwargs: 其他信息
        """
        extra_info = " | ".join([f"{k}={v}" for k, v in kwargs.items()])
        log_message = f"风险控制 | {risk_type} | {message}"
        if extra_info:
            log_message += f" | {extra_info}"
        logger.warning(log_message)
    
    @staticmethod
    def log_performance(strategy_name: str, metrics: dict):
        """
        记录性能指标
        
        参数:
            strategy_name: 策略名称
            metrics: 性能指标字典
        """
        metrics_str = " | ".join([f"{k}={v}" for k, v in metrics.items()])
        logger.info(f"性能统计 | {strategy_name} | {metrics_str}")


# 创建全局日志实例
log_manager = LoggerManager()

# 导出常用方法
log_info = logger.info
log_debug = logger.debug
log_warning = logger.warning
log_error = logger.error
log_critical = logger.critical
log_trade = log_manager.log_trade
log_strategy = log_manager.log_strategy
log_risk = log_manager.log_risk
log_performance = log_manager.log_performance


if __name__ == "__main__":
    # 测试日志功能
    log_info("系统启动")
    log_debug("调试信息：连接交易所")
    log_warning("警告：网络延迟较高")
    log_error("错误：API调用失败")
    
    # 测试交易日志
    log_trade("开仓", "BTC-USDT-SWAP", "买入", 0.1, 50000, 策略="双均线", 杠杆=5)
    
    # 测试策略日志
    log_strategy("双均线策略", "生成买入信号", 快线=10, 慢线=20, 交叉点=50000)
    
    # 测试风险日志
    log_risk("仓位超限", "当前仓位85%，超过80%限制", 当前仓位="85%", 限制="80%")
    
    # 测试性能日志
    log_performance("双均线策略", {
        "总收益率": "15.5%",
        "最大回撤": "8.2%",
        "夏普比率": 1.8,
        "胜率": "65%"
    })
    
    # 测试敏感信息脱敏
    sensitive_msg = "API Key: abcdefgh123456789xyz, Secret: secret123456789abc, 余额: 123456.78"
    masked_msg = log_manager.mask_sensitive_info(sensitive_msg)
    log_info(f"脱敏测试: {masked_msg}")
